package com.xpp.yanbi.mq;


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class MultiProducer {

    // 表示要向名为“hello” 的队列发送消息
    private final static String QUEUE_NAME = "MULTI_QUEUE";

    public static void main(String[] argv) throws Exception {
        // 创建一个 ConnectionFactory 对象，该对象用于创建 RabbitMQ 服务器的连接
        ConnectionFactory factory = new ConnectionFactory();

        // 设置 ConnectionFactory 的主机为 localhost，表示连接本地运行的 RabbitMQ 服务
        factory.setHost("localhost");

        // 如果 RabbitMQ 服务器修改了默认的用户名、密码或端口，需要在这里指定
        // factory.setUsername("your_username"); // 设置用户名
        // factory.setPassword("your_password"); // 设置密码
        // factory.setPort(5672); // 设置端口号，默认是 5672

        // 创建新的连接和通道
        // Connection 是到 RabbitMQ 服务器的物理 TCP 连接。
        // Channel（通道）是建立在连接之上的逻辑通道，用于执行具体的操作（如声明队列、发布消息、消费消息等）。
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明一个队列
            // 参数说明：
            // 1. QUEUE_NAME：队列的名称
            // 2. true：队列是否持久化（true 表示持久化，RabbitMQ 重启后队列仍然存在）
            // 3. false：队列是否独占（false 表示队列可以被多个连接共享）
            // 4. false：队列是否自动删除（false 表示队列不会在最后一个消费者断开后自动删除）
            // 5. null：队列的其他参数（例如消息的 TTL、队列的最大长度等）
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);

            // 创建一个 Scanner 对象，用于从控制台读取用户输入
            Scanner scanner = new Scanner(System.in);

            // 循环读取用户输入
            while (scanner.hasNext()) {
                // 读取用户输入的一行内容作为消息
                String message = scanner.nextLine();

                // 将消息发布到指定的队列中
                // 参数说明：
                // 1. ""：表示使用默认的交换机（direct 类型）
                // 2. QUEUE_NAME：指定消息要发送到的队列名称
                // 3. MessageProperties.PERSISTENT_TEXT_PLAIN：设置消息的持久化属性（确保消息在 RabbitMQ 重启后不会丢失）
                // 4. message.getBytes(StandardCharsets.UTF_8)：将消息内容转换为字节数组
                channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,
                        message.getBytes(StandardCharsets.UTF_8));

                // 在控制台打印发送的消息内容
                System.out.println(" [x] Sent '" + message + "'");
            }
        }
    }
}